/**
 * @file BlockNet.h
 * @author Lost
 * @date 一月 2020
 * @brief
 * 网络模块导出类
 */

#ifndef __BLOCK_NET_H__
#define __BLOCK_NET_H__

#include "NetBase.h"

 /*!< 最大接收字节数 */
#define MAX_RECV_BUFFER_LEN 10240


/**
 * @brief 网络模块导出类
 */
class CTempNet : public CNetBase
{
public:
    CTempNet();
    virtual ~CTempNet();
public:
    /**
     * @brief 获取接收数据
     */
    const char *GetRecvBuffer(int &iLen) const;

    /**
     * @brief 清除接收缓存
     */
    void ClearRecvBuffer();

    /**
     * @brief 获取连接标记
     */
    int GetConnectFlag() const;

private:
    /**
     * @brief 接收报文事件
     */
    virtual bool OnPacket(const int iSocket, char *pData, int iLen);
    /**
     * @brief 收到连接事件
     */
    virtual bool OnConnect(const int iSocket);
    /**
     * @brief 收到关闭事件
     */
    virtual bool OnClose(const int iSocket);

private:
    /*!< 接收数据 */
    char m_csBuffer[MAX_RECV_BUFFER_LEN];

    /*!< 接收数据长度 */
    int m_iLen;

    /*!< 连接标记 */
    int m_iConnectFlag;
    
};

/**
 * @brief 网络模块导出类
 */
class BlockNet 
{
public:
    BlockNet();
    virtual ~BlockNet();


    /**
     * @brief 初始化
     */
    virtual bool Init();

    /**
     * @brief 添加连接
     */
    virtual int Connect(const char *pIp, int iPort,int iWaitTime);

    /**
     * @brief 发送报文
     * @note 返回发送字节，返回后数据不一定发送到网络层，有可能因为阻塞保存在缓存链表中
     */
    virtual int SendAndRecv(const char *pSendData, int iSendLen,  const char *pRecvData, int &iRecvLen, int iWaitTime);

    /**
     * @brief 发送报文
     */
    virtual void Close(const int iSocket);

private:
    /*!< 连接对象 */
    CTempNet m_oTempNet;

    /*!< 连接套接字 */
    int m_iConnectSocket;
};

#endif